\section{Thread Local Storage}
\label{TLS}
\myindex{TLS}

Это область данных, отдельная для каждого треда. Каждый тред может хранить там то, что ему нужно.
Один из известных примеров, это стандартная глобальная переменная в Си \IT{errno}. 
Несколько тредов одновременно могут вызывать функции возвращающие код ошибки в \IT{errno}, поэтому глобальная переменная здесь не будет работать корректно, 
для мультитредовых программ \IT{errno} нужно хранить в в \ac{TLS}. \\
\\
\myindex{\Cpp!C++11}
В C++11 ввели модификатор \IT{thread\_local}, показывающий, что каждый тред будет иметь свою версию этой переменной, и её можно инициализировать, и она расположена в \ac{TLS}
\footnote{\myindex{C11} В C11 также есть поддержка тредов, хотя и опциональная}:

\begin{lstlisting}[caption=C++11,style=customc]
#include <iostream>
#include <thread>

thread_local int tmp=3;

int main()
{
	std::cout << tmp << std::endl;
};
\end{lstlisting}

Компилируется в MinGW GCC 4.8.1, но не в MSVC 2012.

Если говорить о PE-файлах, то в исполняемом файле значение \IT{tmp} будет размещено именно в секции отведенной \ac{TLS}.

\subsection{Вернемся к линейному конгруэнтному генератору}
\label{LCG_TLS}

Рассмотренный ранее \myref{LCG_simple} генератор псевдослучайных чисел имеет недостаток:
он не пригоден для многопоточной среды, потому что переменная его внутреннего состояния может быть
прочитана и/или модифицирована в разных потоках одновременно.

% subsections

\input{OS/TLS/LCG_win32_RU}
\input{OS/TLS/LCG_linux_RU}

